﻿
// MY_PE_TOOLDlg.h: 头文件
//

#pragma once
#include "CDoubleList.h"
#include "CAddrRes.h"
#include "CMyEdit.h"
#include "CMyEditWord.h"
#include "CMyEditDword.h"
#include "CMyEditSectionName.h"
#include "MyHeadFile.h"
#include "CTreeListDlg.h"


// CMYPETOOLDlg 对话框
class CMYPETOOLDlg : public CDialogEx
{
// 构造
public:
	CMYPETOOLDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MY_PE_TOOL_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()

private:   //子窗口

	CDoubleList *m_pDoubleListCtrl = NULL;
	CAddrRes *m_pAddrRes = NULL;
	CTreeListDlg* m_pTreeListDlg = NULL;

private:   //自己定义的变量

	//树控件的图标
	CImageList m_ImageList;

	//加载菜单
	CMenu m_Menu;

	//用来存储拖放文件的全路径
	TCHAR m_szFileFullPath[MAX_PATH] = { 0 };

	//用来存放文件文件名 (*.exe, *.dll)
	CString m_strFileName;

	//用来存放文件的二进制数据
	char* m_pFileData = NULL;

	//用来存放文件的大小
	DWORD m_dwFileSize = 0;

	//记录是否是真正的PE文件
	BOOL m_bIsPeFile = FALSE;

	//存放树控件点击的字符串
	CString m_strTreeItemText;

private:   //自己定义的函数

	//清空ListCtrl
	void ClearListCtrl();

	//展开树控件
	void ExpandTreeCtrl(HTREEITEM hTreeItem);

	//打开文件初始化
	void OpenFileInit();

	//判断是否是PE文件
	BOOL IsPeFile(PTCHAR szFilePath);

    //判断是否有导出表
    BOOL IsHaveExportTable();

    //判断是否有导入表
	BOOL IsHaveImportTable();

	//判断是否有资源表
	BOOL IsHaveResourceTable();

	//判断是否有重定位表
	BOOL IsHaveRelocationTable();

	//判断是否有调试表
	BOOL IsHaveDebugTable();

	//将数字转换为字符串
	CString IntToString(DWORD nData, DWORD nLen);

	//获取变量Size
	CString GetVariableSizeToString(DWORD nLen);

	//获取变量Size
	DWORD GetVariableSizeToDWORD(CString strType);

    //根据RVA计算FA
    DWORD RVATOFA(DWORD dwRVA);

private:  //显示PE文件内容

    //显示文件信息
    void ShowFileInfo();

	//显示DOS头信息
	void ShowDosHeadInfo();

	//显示NT头信息
	void ShowNtHeadInfo();

	//显示文件头信息
	void ShowFileHeadInfo();

    //显示选项头信息
    void ShowOptionalHeadInfo();

    //显示数据目录
    void ShowDataDirectory();

	//显示节头信息
	void ShowSectionHeadInfo();

	//显示导出目录
	void ShowExportTable();

	//显示导入目录
	void ShowImportTable();

	//显示重定位目录
	void ShowRelocationTable();

	//显示TLS目录
	void ShowTLSTable();

	//显示资源目录
	void ShowResourceTable();

	//显示地址转换
	void ShowAddressConvert();

private:  //双击控件修改内容

	//修改DOS头部内容
	void ModifyDOSHead(LPNMITEMACTIVATE pNMItemActivate);

    //修改NT头部内容
    void ModifyNTHead(LPNMITEMACTIVATE pNMItemActivate);

    //修改FILE头部内容
    void ModifyFileHead(LPNMITEMACTIVATE pNMItemActivate);
	void ModifyFileHeadMachine(int nRow, int nCol, DWORD dwFileOffset);

    //修改OPTIONAL头部内容
    void ModifyOptionalHead(LPNMITEMACTIVATE pNMItemActivate);

	//修改节头部内容
	void ModifySectionHead(LPNMITEMACTIVATE pNMItemActivate);


	//WriteFile
	BOOL MyWriteFile(DWORD dwOffset, DWORD dwSize, void *pValue);

	//WriteBuff
	BOOL MyWriteBuff(DWORD dwOffset, DWORD dwSize, void* pValue);

public:
    CTreeCtrl m_TreeCtrl;
    CListCtrl m_ListCtrl;
	int m_nListRow = 0;
	int m_nListCol = 0;
	DWORD m_dwFileOffset = 0;
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnMove(int x, int y);
    afx_msg void OnDropFiles(HDROP hDropInfo);
	afx_msg void OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnClose();
	afx_msg void OnOpen();
	afx_msg void OnSave();
	afx_msg void OnQuit();
    afx_msg void OnClickList1(NMHDR* pNMHDR, LRESULT* pResult);
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	CMyEditDword m_EditByte;   //定义类的时候，应该是CMyEditByte,但是类名写错了，所以将就着来，这是只能输入一个字节
	CMyEditWord m_EditWord;
	CMyEdit m_EditDword;
	afx_msg void OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnKillfocusEdtValue();
	afx_msg void OnKillfocusEdtDvalue();
	afx_msg void OnKillfocusEdtBvaule();
	CMyEditSectionName m_MyEditSecName;
	afx_msg void OnKillfocusEdtString8();
	afx_msg void OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnIncsec();
	afx_msg void OnAddsec();
	afx_msg void OnAddimport();
};
